package cn.itsource.string;

/**
 *  String 字符串类，底层是基于char[], 一旦创建长度就固定不变了,适用于字符串不经常增删改的操作的场景。
 *  
 *	StringBuilder: 基于定长的char[]，默认长度是16个，适用于频繁操作（增删改插）字符串的场景，该类是线程不安全的。
 *
 *	StringBuffer:基于定长的char[]，默认长度是16个，适用于频繁操作（增删改插）字符串的场景，该类是线程安全的。
 *
 *	因为StringBuilder和StringBuffer拼接字符串效率高，所以，以后拼接字符串较大用这两个类，不拼接用String
 *	因为StringBuilder效率更高，如果是单线程和多线程没有线程安全要求，用StringBuilder
 *	如果是多线程有线程安全要求，用StringBuffer
 *
 */
public class StringBuilderTest {

	public static void main(String[] args) {
		/*
		 * 构造方法：
		 * 		1.StringBuilder() 构造一个没有字符的字符串构建器，初始容量为16个字符。  
				2.StringBuilder(CharSequence seq) 构造一个包含与指定的相同字符的字符串构建器 CharSequence 。  
				3.StringBuilder(int capacity) 构造一个没有字符的字符串构建器，由 capacity参数指定的初始容量。  	节省了数组扩容时间
				4.StringBuilder(String str)构造一个初始化为指定字符串内容的字符串构建器。  
		 *
		 */
		StringBuilder sb = new StringBuilder();//创建一个默认16个长度的char[]数组
		StringBuilder sb2 = new StringBuilder("abc");//创建一个19个长度的char[]数组
		
		/*
		 * 常用方法：
		 * 		1. StringBuilder append(Object obj) 在队尾添加字符串   
		 * 		2. StringBuilder delete(int start, int end)  删除指定起始和结束位置之间的字符（含头不含尾）
		 * 		3. StringBuilder deleteCharAt(int index) 删除指定下标处的字符
		 * 		4. StringBuilder insert(int offset, Object obj) 在指定下标处插入一个任意类型数据
		 * 		5. StringBuilder reverse()将字符串翻转
		 * 		6. void setCharAt(int index, char ch) 修改指定下标处的字符为ch  
				7. void setLength(int newLength)  设置字符串长度是newLength
   				8. trimToSize() 将所有没有使用的数组空间去除	。 如果使用setLength,该方法无效
		 * 		9. int capacity() 返回当前容量。  
		 */
		
		//append方法
		sb.append(true).append("abc");
		System.out.println(sb);
		
		//delete方法
		sb.delete(0, 3);//含头不含尾
		System.out.println(sb);
		
		//3. StringBuilder deleteCharAt(int index) 删除指定下标处的字符
		sb.deleteCharAt(0);
		System.out.println(sb);
		
		//insert
		sb.insert(0,true).insert(0,"狼牙棒").insert(0, new Object());
		System.out.println(sb);
		
		//reverse()
		sb.reverse();
		System.out.println(sb);
		
		//setCharAt()
		sb.setCharAt(0, '插');
		System.out.println(sb);
		
		//setLength()
//		sb.setLength(1000);
		System.out.println(sb.length());
		System.out.println(sb);
		
		//int capacity() 返回当前容量。  
		int capacity = sb.capacity();
		System.out.println(capacity);
		
		System.out.println("==================");
		//trimToSize() 如果使用setLength,该方法无效
		StringBuilder sb3 = new StringBuilder("abc");//长度是19  
		int capacity3 = sb3.capacity();
		System.out.println(capacity3);
		sb3.trimToSize();
		int capacity4 = sb3.capacity();
		System.out.println(capacity4);
		System.out.println(sb3);
		
	}

}
